static inline float _cbrtf(float x)
{
- double_t r,T;
+ float r,T;
union {float f; uint32_t i;} u = {x};
uint32_t hx = u.i & 0x7fffffff;
u.i &= 0x80000000;
u.i |= hx;
- /*
- * First step Newton iteration (solving t*t-x/t == 0) to 16 bits. In
- * double precision so that its terms can be arranged for efficiency
- * without causing overflow or underflow.
- */
T = u.f;
r = T*T*T;
- T = T*((double_t)x+x+r)/(x+r+r);
+ T = T*((float)x+x+r)/(x+r+r);
- /*
- * Second step Newton iteration to 47 bits. In double precision for
- * efficiency and accuracy.
- */
r = T*T*T;
- T = T*((double_t)x+x+r)/(x+r+r);
+ T = T*((float)x+x+r)/(x+r+r);
- /* rounding to 24 bits is perfect in round-to-nearest mode */
return T;
}